package demo1;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 86185
 * Date: 2023-04-07
 * Time: 19:02
 */
public class GrayLinearTrans {
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    /**
     * 线性变化
     * 最常用的是线性变换．即g(i,j)=α⋅f(i,j)+β
     * f(i,j)是原像素值,g(i,j)是变换后的像素值.
     * α调整对比度,β调整亮度.有时也称之为gain和bias参数.
     * 线性变换有个问题,如例图（下面附上）,α=1.3 and β=40,提高原图亮度的同时,
     * 导致云几乎看不见了.如果要看见云的话,山的亮度又不够.
     * @param image
     */
    public static void transformation_1(Mat image) {
        // 初始化一个与输入图像大小深度一致的无数据的Mat对象，用来存储调整后的图像数据
        Mat dst = new Mat(image.size(), image.type());
        //获取图像通道数
        int channels = image.channels();
        //初始化需要的变量
        double[] pixelArr = new double[3]; //存储像素的值
        float alpha = 1.3f; //调整对比度参数
        float bate = 40f; //调整亮度参数
        //此处也可使用convertTo()方法，传参请看下面伽马校正里的详解
        //image.convertTo（new_image，-1，alpha，beta）;
        for (int i = 0, rlen = image.rows(); i < rlen; i++) {
            for (int j = 0, clen = image.cols(); j < clen; j++) {
                if (channels == 3) {//1 图片为3通道即(B,G,R)
                    pixelArr = image.get(i, j).clone();
                    pixelArr[0] = pixelArr[0]*alpha+bate;//B
                    pixelArr[1] = pixelArr[1]*alpha+bate;//G
                    pixelArr[2] = pixelArr[2]*alpha+bate;//R
                    dst.put(i, j, pixelArr);
                } else {//2 图片为单通道即灰度图
                    pixelArr=image.get(i, j).clone();
                    dst.put(i, j, pixelArr[0]*alpha+bate);
                }
            }
        }
        HighGui.imshow("线性变化", dst);
        HighGui.waitKey();
    }
    public static void main(String[] args) {
        Mat src = Imgcodecs.imread("scenery.jpg");
        HighGui.imshow("src", src);
        HighGui.waitKey();

        transformation_1(src);


    }
}
